#! /bin/sh
# PCP QA Test No. 200
# $PMCD_RECONNECT_TIMEOUT validation
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard filters
. ./common.product
. ./common.filter
. ./common.check

status=1
rm -f $seq.full

trap _cleanup 0 1 2 3 15

_stop_auto_restart pmcd

_cleanup()
{
    [ -f $tmp.pmcd.conf ] && $sudo cp $tmp.pmcd.conf $PCP_PMCDCONF_PATH
    [ "$PCP_PLATFORM" != "linux" ] && _change_config pmlogger on
    _service pcp restart 2>&1 >/dev/null
    _restore_auto_restart pmcd
    _wait_for_pmcd
    _wait_for_pmlogger
    $sudo rm -f $tmp.pmcd.conf
    rm -f $tmp.*
    exit $status
}

_wait_for_pmcd_exit()
{
    # 3 seconds default seems like a reasonble max time to cleanup
    #debug# set -x
    _can_wait=${1-3}
    _i=0
    _dead=false
    while [ $_i -lt $_can_wait ]
    do
	if netstat -t -n -l | grep :44321 >/dev/null
	then
	    sleep 1
	    _i=`expr $_i + 1`
	else
	    _dead=true
	    break
	fi
    done
    if $_dead
    then
	:
    else
	date
	echo "Arrgghhh ... pmcd at $_host failed to stop after $_can_wait seconds"
	case $_host
	in
	    localhost|unix:|local:|`hostname`)
		# these are all local PMCD's
		#
		echo "=== pmcd.log ==="
		cat $PCP_LOG_DIR/pmcd/pmcd.log

		echo "likely looking processes ..."
		ps "$PCP_PS_ALL_FLAGS" | egrep "[p]m|[P]ID"
		;;
	    *)
		# assume a remote PMCD
		#
		ssh pcpqa@$_host "sh -c '. \$PCP_DIR/etc/pcp.env; echo; echo "=== pmcd.log ==="; [ -f \$PCP_LOG_DIR/pmcd/pmcd.log ] && cat \$PCP_LOG_DIR/pmcd/pmcd.log; [ -f \$PCP_LOG_DIR/pmcd.log ] && cat \$PCP_LOG_DIR/pmcd.log; echo; echo likely looking processes ...; ( ps \$PCP_PS_ALL_FLAGS | egrep \"[p]m|[P]ID\" )'" </dev/null
		;;
	esac
	status=2
	exit $status
    fi
}

_filter()
{
    $PCP_AWK_PROG '
BEGIN		{ last = "" }
$0 != last	{ print; last = $0 }' \
    | sed \
	-e 's/failed: Connection reset by peer/failed: IPC protocol failure/' \
	-e 's/[A-Z][a-z][a-z] [A-Z][a-z][a-z]  *[0-9][0-9]* [0-9][0-9]:[0-9][0-9]:[0-9][0-9]/DATE/' \
	-e '/recon([0-9][0-9]*)/s//recon(PID)/' \
	-e '/^Context\[/d' \
	-e '/^contexts\[/d' \
	-e '/^pmReconnectContext(/d' \
	-e '/^Dump Contexts:/d' \
	-e '/^Dump Instance Profile /d' \
	-e '/^IPC table fd/d' \
	-e '/^__pmConnectPMCD(/d' \
	-e '/^__pmDecodeXtendError:/d' \
	-e '/^pmNewContext(/d' \
	-e '/^__pmSendCreds:/d' \
	-e '/^__pmSetSocketIPC:/d' \
	-e '/^__pmSetVersionIPC:/d' \
	-e '/^__pmSetFeaturesIPC:/d' \
	-e '/^__pmDataIPC: /d' \
	-e '/^__pmSetDataIPC:/d' \
	-e '/^pmWhichContext(/d' \
	-e '/__pmConnect(fd=.*) ->/d' \
	-e '/__pmCloseChannelbyContext/d' \
    | $PCP_AWK_PROG '
/delay: 2 /	{ print "delay: 2-4 secs"; next }
/delay: 3 /	{ print "delay: 2-4 secs"; next }
/delay: 4 /	{ print "delay: 2-4 secs"; next }
/delay: 5 /	{ print "delay: 5-7 secs"; next }
/delay: 6 /	{ print "delay: 5-7 secs"; next }
/delay: 7 /	{ print "delay: 5-7 secs"; next }
		{ print }'
    # note: now that pmcd starts and stops very quickly, we use a
    # strategy in testing valid reconnect strings with less-than-
    # five-seconds (alot less) and any errors fall back to using
    # the defaults, which are 5,10,etc.
}

cat >$tmp.new <<End-of-File
# Installed by PCP QA test $seq on `date`
#
# Name	Id	IPC	IPC Params 	File/Cmd
pmcd	2	dso	pmcd_init	$PCP_PMDAS_DIR/pmcd/pmda_pmcd.$DSO_SUFFIX
sample	29	pipe	binary 		$PCP_PMDAS_DIR/sample/pmdasample -d 29 
End-of-File

# copy the pmcd config file to restore state later.
$sudo cp $PCP_PMCDCONF_PATH $tmp.pmcd.conf
$sudo cp $tmp.new $PCP_PMCDCONF_PATH

# ensure we have pmcd ready for the first iteration.
# just doing a start may race and find the pmcd socket busy,
# so stop, wait a little, and start
_service pcp stop >/dev/null 2>&1
_wait_for_pmcd_exit
_service pmcd start >/dev/null 2>&1
_wait_for_pmcd

# real QA test starts here
for xxx in "" "1,1,2,2" "2" "1-2" "1,2,foo"
do
    if [ "X$xxx" = X ]
    then
	unset PMCD_RECONNECT_TIMEOUT
    else
	PMCD_RECONNECT_TIMEOUT="$xxx"
	export PMCD_RECONNECT_TIMEOUT
    fi

    echo
    echo "PMCD_RECONNECT_TIMEOUT=\"$PMCD_RECONNECT_TIMEOUT\""
    echo "start PMCD_RECONNECT_TIMEOUT=$PMCD_RECONNECT_TIMEOUT" >>$seq.full
    echo "start `date`" >>$seq.full

    DEBUG=
    DEBUG=-D16
    src/recon $DEBUG >$tmp.out 2>&1 &

    pmsleep 1.1
    echo "begin stop pmcd `date`" >>$seq.full
    _service pmcd stop | _filter_pcp_stop
    echo "end stop pmcd `date`" >>$seq.full
    _wait_for_pmcd_exit
    pmsleep 1.1
    echo "begin start pmcd `date`" >>$seq.full
    _service pmcd start 2>&1 \
    | _filter_pcp_start
    echo "end start pmcd `date`" >>$seq.full

    wait
    _filter <$tmp.out
    cat $tmp.out >>$seq.full
done

status=0
exit
